/**
 *@author qzg
 *@description 全局捕获错误处理中间件
 *@createDate 2022年07月05日 19:12:44
 */
import Application, { Middleware } from 'koa'
// 格式化错误响应
export type ctx = Application.ParameterizedContext<Application.DefaultState, Application.DefaultContext, any>
export type next = Application.Next
const errorHandle: Middleware = async (ctx, next) => {
  try {
    await next()
  } catch (error: any) {
    //判断是否为已知错误（我们用自己封装的error()抛出的错误）
    if (error?.isKnown) {
      ctx.body = { type: '已知错误', code: error.status, message: error.message }
    } else if (error?.details) {
      //joi验证层
      //数据格式化输出
      const message = error?.details[0]?.message

      ctx.body = { type: 'joi参数格式错误', code: 400, message }
    } else if (error.message === 'Authentication Error') {
      ctx.body = { type: '鉴权失败', code: 401, message: '未携带token或携带了无效的token,如已过期' }
    } else {
      //未知错误直接抛出
      throw error
    }
  }
}

export default errorHandle
